//
// Created by wkm on 2024-04-18.
//

#include "shiftrows.h"

void shiftrows::prc_shiftrows() {
    if (reset) {
        for (int i = 0; i < 16; i++) {
            temp_input_data[i] = 0;
        }
        done = waiting_task;
        next_done = waiting_task;
    }

    if (done == waiting_task && start) {
        temp_input_data[0] = input_data_1;
        temp_input_data[1] = input_data_2;
        temp_input_data[2] = input_data_3;
        temp_input_data[3] = input_data_4;
        temp_input_data[4] = input_data_5;
        temp_input_data[5] = input_data_6;
        temp_input_data[6] = input_data_7;
        temp_input_data[7] = input_data_8;
        temp_input_data[8] = input_data_9;
        temp_input_data[9] = input_data_10;
        temp_input_data[10] = input_data_11;
        temp_input_data[11] = input_data_12;
        temp_input_data[12] = input_data_13;
        temp_input_data[13] = input_data_14;
        temp_input_data[14] = input_data_15;
        temp_input_data[15] = input_data_16;

        sc_uint<DATA_SIZE> a, b, c, d;
        //第1行保持不变

        //第2行左移1位
        a = input_data_2;
        temp_input_data[1] = input_data_6;
        temp_input_data[5] = input_data_10;
        temp_input_data[9] = input_data_14;
        temp_input_data[13] = a;

        //第三行左移2位，交换2次数字来实现
        b = input_data_3;
        temp_input_data[2] = input_data_11;
        temp_input_data[10] = b;
        c = input_data_7;
        temp_input_data[6] = input_data_15;
        temp_input_data[14] = c;

        //第四行左移3位，相当于右移1次
        d = input_data_16;
        temp_input_data[15] = input_data_12;
        temp_input_data[11] = input_data_8;
        temp_input_data[7] = input_data_4;
        temp_input_data[3] = d;

        next_done = computing_task;
    }

    if (done == computing_task) {
        output_data_1 = temp_input_data[0];
        output_data_2 = temp_input_data[1];
        output_data_3 = temp_input_data[2];
        output_data_4 = temp_input_data[3];
        output_data_5 = temp_input_data[4];
        output_data_6 = temp_input_data[5];
        output_data_7 = temp_input_data[6];
        output_data_8 = temp_input_data[7];
        output_data_9 = temp_input_data[8];
        output_data_10 = temp_input_data[9];
        output_data_11 = temp_input_data[10];
        output_data_12 = temp_input_data[11];
        output_data_13 = temp_input_data[12];
        output_data_14 = temp_input_data[13];
        output_data_15 = temp_input_data[14];
        output_data_16 = temp_input_data[15];

        next_done = task_finished;
    }
    done = next_done;
}
